/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.common;

import entity.Fornitura;
import entity.Prodotto;
import facade.FornituraFacade;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Antonio
 */
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class FornituraManager implements FornituraManagerLocal {

    @EJB
    private FornituraFacade fornituraFacade;
    @PersistenceContext(unitName = "E-Market-ejbPU")
    private EntityManager em;

    public void persist(Object object) {
        em.persist(object);
    }
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public boolean creaFornitura(Fornitura fornitura) {

        if (fornitura == null) {

            throw new NullPointerException();
        }

        Query q = em.createNamedQuery("fornitura.cercaFornituraNegozio");
        q.setParameter(1, fornitura.getNegozio().getId());
        q.setParameter(2, fornitura.getProdotto().getCodiceBarre());

        if (q.getResultList().isEmpty()) {

            fornituraFacade.create(fornitura);
        } else {

            fornitura.setQuantita(fornitura.getQuantita() + ((Fornitura) q.getSingleResult()).getQuantita());

            fornituraFacade.edit(fornitura);
        }
        return true;
    }// creaFornitura

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public boolean rimuoviFornitura(Fornitura fornitura) {

        if (fornitura == null) {

            throw new NullPointerException();
        }

        fornituraFacade.remove(fornitura);

        return true;
    }// rimuoviFornitura

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public boolean modificaFornitura(Fornitura fornitura) {

        if (fornitura == null) {

            throw new NullPointerException();
        }

        fornituraFacade.edit(fornitura);

        return true;
    }// modificaFornitura

    @Override
    public List<Fornitura> cercaTutto() {

        Query q = em.createNamedQuery("fornitura.ottieniTutto");

        return q.getResultList();
    }// cercaTUtto

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public boolean creaForniture(List<Fornitura> listF) {

        if (listF.isEmpty()) {

            return false;
        }

        for (Fornitura f : listF) {

            this.creaFornitura(f);
        }

        return true;
    }// creaForniture

    @Override
    public Fornitura cercaFornituraNegozio(Long idProdotto, Long idNegozio) {

        if (idProdotto == null || idNegozio == null) {

            throw new NullPointerException();
        }

        Query q = em.createNamedQuery("fornitura.cercaFornituraNegozio");
        q.setParameter(1, idNegozio);
        q.setParameter(2, idProdotto);

        if (q.getResultList().isEmpty()) {
            return null;
        }

        return (Fornitura) q.getSingleResult();
    }

    @Override
    public List<Prodotto> cercaProdottiDisponibiliNegozio(Long idNegozio) {

        if (idNegozio == null) {

            throw new NullPointerException();
        }

        Query q = em.createNamedQuery("fornitura.prodottiDisponibiliNegozio");
        q.setParameter(1, idNegozio);
        q.setParameter(2, 0);

        return q.getResultList();
    }// cercaProdottiDisponibiliNegozio

    @Override
    public List<Fornitura> prodottiInEsaurimentoNegozio(Long idNegozio, int quantitaMin) {

        if (idNegozio == null) {

            throw new NullPointerException();
        }

        if (quantitaMin <= 0) {

            throw new IllegalArgumentException();
        }

        Query q = em.createNamedQuery("fornitura.prodottiInEsaurimentoNegozio");
        q.setParameter(1, idNegozio);
        q.setParameter(2, quantitaMin);

        return q.getResultList();
    }// prodottiInEsaurimentoNegozio
}
